#问题分类模块
import openai
import json
import requests
from config import XINGHE_API_KEY, XINGHE_BASE_URL, XINGHE_MODEL, QUESTION_LABELS
from model_status import model_status

class QuestionClassifier:
    def __init__(self, xinghe_api_key=XINGHE_API_KEY):
        # 只保留星河大模型客户端
        self.xinghe_client = openai.OpenAI(api_key=xinghe_api_key, base_url=XINGHE_BASE_URL)
        self.labels = QUESTION_LABELS
    
    def classify(self, question):
        """分类用户问题"""
        system_prompt = """你是一个Rust编程问题分类专家。请将用户的问题分类为以下6种类型之一：

1. greeting - 问候语类：打招呼、问候、寒暄等
   示例："你好"、"Hello"、"早上好"、"Hi"、"你好吗？"

2. definition - 概念定义类：询问Rust概念、术语的定义和含义
   示例："生命周期是什么？"、"所有权是什么意思？"

3. usage - 用法说明类：询问如何使用某个功能、语法或API
   示例："如何使用迭代器？"、"怎么声明可变变量？"

4. error_debug - 错误调试类：询问编译错误、运行时错误或调试问题
   示例："这个编译错误怎么解决？"、"为什么会出现借用检查器错误？"

5. comparison - 语言/概念对比类：比较Rust与其他语言或概念的异同
   示例："Rust和C++有什么区别？"、"生命周期和垃圾回收有什么不同？"

6. faq - 常见问题类：一般性的Rust学习问题或最佳实践
   示例："Rust适合什么项目？"、"如何学习Rust？"

请返回JSON格式：{"label": "分类标签", "confidence": 置信度(0-1)}"""

        # 优先使用星河大模型
        if model_status.status['xinghe']['available']:
            try:
                response = self.xinghe_client.chat.completions.create(
                    model=XINGHE_MODEL,
                    messages=[
                        {"role": "system", "content": system_prompt},
                        {"role": "user", "content": f"请分类这个问题：{question}"}
                    ],
                    max_tokens=100,
                    temperature=0.1
                )
                
                result_text = response.choices[0].message.content.strip()
                # 尝试解析JSON
                try:
                    result = json.loads(result_text)
                    if result['label'] not in self.labels:
                        result['label'] = 'faq'  # 默认分类
                    model_status.update_status('xinghe', True)
                    return result
                except json.JSONDecodeError:
                    # 如果JSON解析失败，使用简单规则分类
                    model_status.update_status('xinghe', False, "JSON解析失败")
                    return self._rule_based_classify(question)
                    
            except Exception as e:
                print(f"星河大模型分类API调用失败: {e}")
                model_status.update_status('xinghe', False, str(e))
        
        # 使用规则分类作为备用方案
        print("使用本地规则分类作为备用方案")
        model_status.update_status('fallback', True)
        return self._rule_based_classify(question)
    
    def _rule_based_classify(self, question):
        """基于规则的备用分类方法"""
        question_lower = question.lower()
        
        # 定义关键词规则
        greeting_keywords = ['你好', 'hello', 'hi', '早上好', '下午好', '晚上好', '你好吗', 'how are you', 'good morning', 'good afternoon', 'good evening']
        definition_keywords = ['是什么', '什么意思', '定义', '概念', '术语']
        usage_keywords = ['怎么', '如何', '使用', '用法', '语法']
        error_keywords = ['错误', '编译', '运行', '调试', '问题', '失败']
        comparison_keywords = ['区别', '不同', '比较', 'vs', '对比']
        
        # 首先检查问候语
        if any(keyword in question_lower for keyword in greeting_keywords):
            return {"label": "greeting", "confidence": 0.9}
        elif any(keyword in question_lower for keyword in definition_keywords):
            return {"label": "definition", "confidence": 0.8}
        elif any(keyword in question_lower for keyword in usage_keywords):
            return {"label": "usage", "confidence": 0.8}
        elif any(keyword in question_lower for keyword in error_keywords):
            return {"label": "error_debug", "confidence": 0.8}
        elif any(keyword in question_lower for keyword in comparison_keywords):
            return {"label": "comparison", "confidence": 0.8}
        else:
            return {"label": "faq", "confidence": 0.6}